from openai import OpenAI

from app_config import AppConfig
from log_manager import LogManager


def gen_subtitle_check_prompt(subtitle_text, ref_text):
    if ref_text:
        cleaned_ref_text = []
        for line in ref_text.split("\n"):
            if "原视频" not in line:
                cleaned_ref_text.append(line)
        ref_text = "\n".join(cleaned_ref_text)
        system_prompt = (
            "你是一个专业的字幕校对专家。请仔细对比原始内容和识别出的字幕，修正其中的错误。\n"
            "要求：\n"
            "1. 严格保持SRT字幕格式不变\n"
            "2. 只修改文本内容中的错误\n"
            "3. 确保修改后的内容与原始内容一致\n"
            "4. 当字幕出现跳跃时，尽量使用文本字幕内容一致的时间范围，而不是直接往后罗列\n"
            "5. 当发现有一段字幕和原始内容意思差距很大时，应该是字幕中插入的视频原声字幕，应保留中间可能插入的原声字幕\n"
            "6. 校对后的时间，要根据文本内容，找到和原字幕一致的时间范围\n"
            "7. 请仅输出修改后的内容，不要输出任何其他内容\n"
        )
        user_prompt = "原始内容：\n" f"{ref_text}\n\n" "字幕内容：\n" f"{subtitle_text}"
    else:
        system_prompt = (
            "你是一个专业的字幕校对专家。请修正字幕内容中的错误。\n"
            "要求：\n"
            "1. 严格保持SRT字幕格式不变\n"
            "2. 每个时间轴和序号保持不变\n"
            "3. 只修改文本内容中的错误\n"
            "5. 请仅输出修改后的内容，不要输出任何其他内容\n"
            "6. 不要修改时间轴和序号\n"
        )
        user_prompt = "字幕内容：\n" f"{subtitle_text}"
    return system_prompt, user_prompt


def gen_youhua_prompt(text):
    system_prompt = """你现在是一个短视频解说文案专家，请根据原始内容，大幅度修改文案，情节不变，意思不变
写作要求:
1.多样性(Perplexity)衡量文本的复杂程度，反映了词汇的丰富性和不可预测性。更高的多样性表示内容更加多变并且更难预测。
2.节奏感(Burstiness)则指句子长度和句式的波动幅度。
3.多样性和高节奏感的写作风格通常包含丰富的词汇、长短交替的句子，以及多样化的句式，这能让内容更生动和阅富有层次感。
4.你的输出应必须展现高多样性和高节奏感。
5.减少修辞, 减少内容扩展
6.字数在1000字左右。
    """

#     system_prompt = """请将以下原始内容，修改为爆款影视解说文案，
# 以去除和其他人的重复度，但是文案的意思不能改变，情节细节也不能变，否则就无法和视频对应。
# 尽量用比较直白的语言描述
# 字数在800字左右。
# 仅输出解说文案，不要输出其他内容。
# """

    user_prompt = "原始内容：\n" f"{text}"
    # user_prompt = "文案：\n" f"{text}"
    return system_prompt, user_prompt


def call_llm(system_prompt, user_prompt):
    """
    调用大模型
    """
    try:
        LogManager.log("正在加载配置...")
        app_config = AppConfig()

        LogManager.log("正在初始化API客户端...")
        client = OpenAI(
            api_key=app_config["api_key"],
            base_url=app_config["base_url"],
            timeout=120.0,
        )

        LogManager.log("正在调用大模型API...")
        completion = client.chat.completions.create(
            model=app_config["model"],
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt},
            ],
            stream=True,
            temperature=0.3,
        )

        content = ""
        LogManager.log("正在生成回复...")
        try:
            in_thinking = False
            for chunk in completion:
                if chunk.choices[0].delta.content is not None:
                    item = chunk.choices[0].delta.content
                    LogManager.log(item, end="")
                    if "<think>" in item:
                        in_thinking = True
                        continue
                    if in_thinking:
                        if "</think>" in item:
                            in_thinking = False
                            sp = item.split("</think>")
                            if len(sp) > 1:
                                content += sp[1]
                        continue
                    content += item
        except Exception as e:
            LogManager.log(f"\n处理API响应时出错: {str(e)}")
            raise

        LogManager.log("\n生成完成")
        return content
    except KeyboardInterrupt:
        LogManager.log("\n用户中断，正在退出...")
        raise
    except Exception as e:
        LogManager.log(f"\n发生错误: {str(e)}")
        LogManager.log(f"错误类型: {type(e).__name__}")
        LogManager.log(f"错误详情: {str(e)}")
        raise
